Planet 無 Projects

January 06, 2009 07:46 PM

January 06, 2009

Mozilla

Aki Sasaki: nextgen build infrastructure

[brainstorm]:

I keep running into the same questions, project after project, company after company. How do I see who broke the build? How do I know if this bug has been fixed in this codeline? How do I see the difference between these two builds? And how can we make this all happen faster? Smoother? Easier? And you revisit the same questions as new tangles and complexities of scale are added to the equation.

I joined Netscape in 2001, partially to play with a bunch of weird unices, partially to see How Build Engineering is Done Properly. I had already tackled LXR/ViewCVS + Bonsai + Tinderbox elsewhere, and that toolchain has loomed large at every place I've been, at least in concept. Source browsing + repository querying + continuous integration, no matter which specific products you use.

Here I am, back at Mozilla after a number of years away, and I'm amused (and pleased) to see that the current state of things is surprisingly analogous to how I designed our build system elsewhere. We had the db with history and archived configurations; buildbot has the daemon with real-time log views; but otherwise things are fairly close. Both systems are in similar stages of development, ready to take that next step.

Here are some thoughts about the direction that next step could go. Please keep in mind that I'm trying to ignore how much work this will all be to implement for the moment, so I can write down my ideas without cringing.


[Is hgweb a strong bonsai replacement?]:

Installing Bonsai or its equivalent has been my immediate priority for each new project I've joined. Why? It gives you immediate insight into the code base. What's changed. Who's changing it. The full history, across all branches.

I honestly don't see how you manage a large scale CVS project without it. You could manage in Subversion, possibly, but Kamikaze and ViewVC's query database still give you so much more than svn log: cross-repository queries and GUI-user friendliness come to mind.

As for hgweb: it seems to be working for people currently. I can't help but feel like it's missing a lot. I don't claim to be a Mercurial expert by any means. But at first blush:

  1. How do you differentiate which checkins are in linear history? (Covered here)
  2. Where's the guilty column? Not sure if this is a missing feature in hgweb or if it's just a matter of needing tinderbox/hg code. But tinderbox used to query bonsai for this info.
  3. Where are the complex queries? I see you can query by date range in the pushlog, but I haven't found a way to also query by author, bug number, whether the checkin was in linear history or not, and combinations using AND or OR.
  4. How do I query which repositories bug 12345 has been fixed in? (cross-repo queries)
  5. Given a query, how do I tell which build first contained a checkin, which build preceded that one, where to get them, and what the delta is between the two builds in terms of code, performance, and unit test results? (cross-system links)
  6. For that matter, given a query for any two arbitrary checkins in any supported repositor(y|ies), how do we find the above deltas? (cross-repo cross-system links)

Point 4 came up in conversation. We were discussing updating Bugzilla with checkin information, which I've done previously. Adding comments or keywords to a bug is certainly one approach, at the risk of potentially cluttering already-cluttered bugs further. Linking the bug to a Bonsai2/hgweb query that gives you the same information is another. We're still thinking about this one.

Points 5 and 6 depend on a build db, which I'll discuss in more detail shortly.

Whether these features are wanted/needed by the community, and whether desired features are best written into hgweb or an external database like Bonsai's remain to be seen.


[Tinderbox: waterfall vs dashboard]:

Ken Estes had a hard time convincing Netscape to switch to Tinderbox 2, but I felt its modularity and ease of extensibility and customization made it ideal for projects unburdened by the history and existing ingrained processes Moz has. It's great for what it is. As is Tinderbox 1, in its own special way.

Having said that, there are plenty of Tinderbox detractors, and it's hard to defend certain Tinderbox behaviors. Its reliance on procmail, for instance. And it's fairly easy to see how a single waterfall can get overwhelmed with information.

rhelmer covered the current tinderbox/buildbot split, and is among the voices I've heard/read calling for a move away from the waterfall view, which I don't completely understand. I do understand that the waterfall is far from ideal as a solitary view. But it does represent the activity of builds and build machines over a brief amount of time quite well. Even better when you have a guilty column ;-)

So, why not have both? Or multiple? Not to clutter, but to present different ways of accessing the data. Each with their own strengths.

We already have different views. The waterfall is one. Another is the sidebar panel or summary view. But we could add something similar to the Cruise Control and Bamboo dashboard pages. Or create something somewhere in between: collapsible "groups" of builds with ETAs and links to drill down. Customizable per-user views. Graphs of tree-openness over time. Each of these brings something to the table that the others aren't as strong at.

(joduinn points out these cruisecontrol and agitar screenshots)

And how do you add a view? Not by putting more load on procmail, certainly. These would be built from build database queries. If we build an anonymous read-only db mirror, or generate the necessary feeds, community members could create their own views.

I saw the hard sell that Ken Estes faced, trying to convince people that something as vital as the Tinderbox waterfall could be changed without altering the Mozilla Way. My solution would be to add views over time, rather than replace them; we can trim if and when old views are no longer wanted/needed.

However, there is that pesky little fact that the build database doesn't exist yet.


[Buildbot: strengths and weaknesses]:

I've only recently started using buildbot. I don't claim to be an expert. Here are my impressions in my brief amount of time using it:

Strengths

Shortcomings


[Pull, not push]:

During one of my interviews for Mozilla, I covered build database architecture. I pretty much covered what I had already planned and [mostly] implemented elsewhere, and the designs matched perfectly, except for one thing.

Buildbot pushes queued builds to its slaves via twisted. I took a similar approach independently, using sshd; when a single server coordinates everything, it's fairly easy to take the push model. But during the interview, I was asked specifically about pulls.

Overall, same thing, right? Pushing from a central server, or having multiple servers pull from a central queue.

Except if you pull from a central queue, rather than push from that queue, you remove your dependence on a single build server knowing everything. The database becomes central, but there are already established ways of mirroring those.

After thinking about this for a while, I thought why not? Two or five servers queuing builds, each able to take over the others' responsibilities if needed. Three or ten servers pulling builds from the queue, managing distributed build farms, each able to take over others' builds and build clients if one or more servers were to go down. The database is the central thing, not any instance of buildbot. And all the configs are in source.

The queuers could also do routine maintenance: act on stalled builds, determining status and requeuing or failing out as necessary. Inserting maintenance tasks as needed into host pools, but without taking too many build hosts out of any one pool at any time.

With this model, I would guess -- not promise or guarantee, but strongly guess -- we could scale up by an order of magnitude. Add quote-unquote buildbot masters as queuers or build coordinators as needed. Different groups could have their own sets if needed or desired. And if the db became the bottleneck, I imagine we could find ways to logically split it up.

I've never seen a build system anywhere near that scalable. Except in my head. But it's exciting to think.


[Still a ways out]:

I've been expounding on some of my ideas about what we could potentially do with a build db... which doesn't exist yet. It may take a while.

I think the first step is to be able to dump queues to disk, possibly in yaml, possibly in python, and be able to read those queues back into buildbot at start. Then add a module that lets us queue to disk by default. Hopefully during the process we can reduce the amount of information in the request to the bare bones: revision, requester, build type, time of request, etc., and separate it from the actual build logic.

I'm not quite used to working by announcing plans or ideas in public before they're implemented; even at NSCP we tended to keep things in-house unless they were Mozilla-specific. Hopefully some of these ideas resonate with other people as well; let me know. And hopefully people can wait a bit if they really want some of these ideas implemented.

... Back to work on the Nokias and try server.


January 06, 2009 07:08 PM

Jabber

Artur Hefczyc: Tigase Tip: Checking the runtime environment

It has happened recently that we have tried very hard to fix a few annoying problems on one of the Tigase installations. Whatever we did, however the problems still existed after uploading a new version and the server restart. It worked fine in our development environment and it just didn't on the target system.

It turned out that due to a specific environment settings on the target system an old version of the Tigase server was always started regardless updates we were uploading. When I finally started looking at the installation the first indication that something is wrong was lack of any log files in place where I expected them.

The best way to check all the environment settings used to start the Tigase server is to use..... check command line parameter:

./scripts/tigase.sh check etc/tigase.conf
Checking arguments to Tigase
TIGASE_HOME = .
TIGASE_JAR = ./jars/tigase-server.jar
TIGASE_PARAMS = etc/tigase.conf
TIGASE_CONFIG =  etc/tigase.xml
TIGASE_RUN = tigase.server.XMPPServer -c etc/tigase.xml --property-file etc/init.properties
TIGASE_PID = ./logs/tigase.pid
TIGASE_OPTIONS = --property-file etc/init.properties

 

JAVA_OPTIONS = -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 \ -Djdbc.drivers=com.mysql.jdbc.Driver:org.postgresql.Driver \ -server -Xms100M -Xmx200M -XX:PermSize=32m -XX:MaxPermSize=256m JAVA =  /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java JAVA_CMD = CLASSPATH = ./jars/tigase-server.jar:./libs/jdbc-mysql.jar:./libs/jdbc-postgresql.jar:\ ./libs/tigase-extras.jar:./libs/tigase-muc.jar:./libs/tigase-pubsub.jar:\ ./libs/tigase-utils.jar:./libs/tigase-xmltools.jar TIGASE_CMD = /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java \ -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 \ -Djdbc.drivers=com.mysql.jdbc.Driver:org.postgresql.Driver \ -server -Xms100M -Xmx200M -XX:PermSize=32m -XX:MaxPermSize=256m \ -cp ./jars/tigase-server.jar:./libs/jdbc-mysql.jar:./libs/jdbc-postgresql.jar:\ ./libs/tigase-extras.jar:./libs/tigase-muc.jar:./libs/tigase-pubsub.jar:\ ./libs/tigase-utils.jar:./libs/tigase-xmltools.jar tigase.server.XMPPServer \ -c etc/tigase.xml --property-file etc/init.properties TIGASE_CONSOLE_LOG = ./logs/tigase-console.log

 In our case TIGASE_HOME was set to a fixed location pointing to an old version of the server files. The quick check command may be a real time saver.

read more

by kobit at January 06, 2009 07:02 PM

Mozilla

Marco Zehe: New feature: Nesting level and position information for HTML lists

The new year has just begun, and we’re already speeding ahead with new features in Firefox trunk nightlies, AKA version 3.2a1pre. These features won’t see inclusion in Firefox 3.1, but are already the next generation features.

The feature I’m going to report on today has to do with position information and nesting level information of ordered and unordered HTML lists.

To give you an example:

  1. Apples
  2. Oranges
  3. Bananas
    • Apples
    • Bananas
    • Oranges

As you can see here, the unordered list is nested within the ordered list. The ordered list has a level of 1, the unordered a level of 2. Also, in case of the unordered list where a number is not provided, there is still an item count that we expose.

The information is exposed in a similar manner as listbox items, combobox entries, or TreeView element information. We have the following object attributes:

We also specify level and position information in the AccessibleDescription for convenience of screen readers that don’t use object attributes yet. So, the inner “Bananas” item has a description of “L2, 2 of 3″, just like a TreeView item would.

But my screen reader already has nesting level and item count information, so why bother?

Well…Because we’re nice! :-) We save newly supporting screen readers or those that don’t want to calculate these values themselves the trouble and do it for them. We know the underlying HTML anyway and can provide the information while building the accessible tree. There is no need to go in and calculate these items yourself any more, or you don’t even need to start doing it. Just use our values if you want to give your users this information.

Bookmark New feature: Nesting level and position information for HTML lists using AddThis

by Marco at January 06, 2009 06:35 PM

Stephen Lau: 7 Things You May (or May Not) Know About Me

… I was tagged!  (by way of @SaraD (blog), who came from @sogrady (blog), and an undoubtedly longer (and more famous) path from there…)

So, 7 things you may or may not know about me….  I believe in open communication and transparency… especially when I’m drunk, so it’s hard to think of seven things I haven’t blabbed about (whether I should have or not) previously…

  1. I was investigated by the FBI.  A story I’d rather not get into on a webpage, but will instead save for some other time when we’re having a drink.  (Hah, the rules don’t say I have to get into details… but suffice to say, it involved AT&T, a phone system exploit and Fry’s Electronics.  Plus I was like 12 at the time.)
  2. Between the ages of 8 and 20, I refused to eat avocado believing myself to be allergic to it.  Within my first two weeks of arriving in the states, I had avocado twice (once raw, and once in guacamole).  I threw up both times.  I fully believed myself to be incapable of eating avocado for the next 12 years until I accidentally ate some guac in a carne asada burrito in Rosarito, Mexico on a long drive for tacos.  God bless Rosarito.
  3. I used to run a bulletin board system (BBS) way back in the day.  It was called “The Nebuolic Cheese”, and it ran Waffle and had a UUCP feed from sbay.org.  That’s right… you can send email VIA THE INTERNETS.  It was awesome and amazing and here’s my proof. (It’s an old sbay.org guide, with my BBS as the example map entry).
  4. I was expelled from high school.  This one involved an Apple Macintosh computer lab, a system administrator who stupidly had a wall mirror behind his desk, and a high school student who happened to have an assigned seat facing the mirror and who learned to read passwords in a backwards keyboard.
  5. I saved every college rejection letter I got (and I got quite a few…. I was only accepted into one college, see #4 above).  I took them to UCSD with me and everytime I got stressed or hated school I pulled them out for inspiration.  To this day I still have them.  No, I don’t look at them anymore.
  6. I have an absolutely awful sense of direction.  If we’re lost, don’t look to me to be any help unless I have my iPhone on me and am getting reception.  What’s worse is I don’t actually care.  I’m quite happy to be lost and wander around aimlessly.  I blame this on living in San Diego for 6 years.  You don’t need to have a sense of direction because you always know where the ocean is (thereby knowing which way is West).
  7. My hair was permed in the 3rd grade.  Really.  I don’t know why, my mum wanted to do it.  The embarassing photographic proof is at my parents house somewhere.  I think I threw it in a closet.
So there you go… I hope those were entertaining at least.  So here are the rules (again, by way of SaraD & SOG): I hereby tag:
  1. Geoff Arnold (@geoffarnold), blog - because he has been my mentor in work and in life, and is the friend I would most describe as a wise sage.
  2. Patrick Finch (@patrickf), blog - because he has a skill a covet: managing to tie pretty much any topic back to football, plus he’s like a good writer and stuff.
  3. Tim Foster (@timfoster), blog - because though I only met him in real life once, I feel like I stalk him via his blog, he’s a super nice guy, and am intrigued to see if there is an evil side to him.
  4. Ryan Tomayko (@rtomayko), blog - because he sits next to me at work and is automatically intriguing because he is the first person I met outside of a large corporation who knew SOG.
  5. Esther Ko (no twitter! OMG!), blog - because she’s a great writer and should blog more.
  6. Mark Finkle (@mfinkle), blog - because his blog has one of the best domain names I’ve seen, and I don’t actually know if I’ve seen him blog personal stuff before and wonder if he would.  Plus I haven’t seen this meme on PMO yet. ;-)
  7. Brian King (@brianking), blog - because I keep meaning to ask him what ‘pogovor’ means and I’m trying to double my chances of getting this meme to cross onto PMO.

by Stephen Lau at January 06, 2009 06:24 PM

Frédéric Buclin: Bugzilla 3.3.1 released


Bugzilla 3.3.1 has been released last night and is the first development snapshot of what will become Bugzilla 3.4, whose feature freeze date is January 29, 2009. More important new features are available in the last Status Update: users can choose their timezone to display dates and times (especially in bug comments), several improvements to custom fields, two new WebService functions (Bug.get_history and User.get), there is now an email preference to get bugmail for new bugs, users can re-order columns in buglists, user account passwords are now encrypted using SHA-256 instead of the UNIX crypt() function (passwords longer than 8 characters are now correctly validated!), some parameters considered obsolete have been removed, Bugzilla can now use an asynchronous job queue for sending mail (optional and disabled by default, check your parameters), on midair collisions users can decide to only submit the comment and skip other changes, … and of course code cleanup and improvements (such as decreasing the load on the DB when viewing bugs, refactoring of the product and classification code).

In a couple of days (I hope!) will also be released Bugzilla 3.3.2, 3.2.1, 3.0.7 and 2.22.7 with several security fixes (a last one to fix, and we are ready to go). Stay tuned!

      

by lpsolit at January 06, 2009 06:17 PM

Python

Armin Ronacher: Pedogit

Sorry, I really could not resist ;-) But I got a better logo monster for the new git website than Dōmo-kun:

pedobear on the git website

January 06, 2009 05:40 PM

Jabber

Dave Cridland: Twitter security thing

Okay, I know I’m probably just repeating what everyone else is probably saying, but consider this:

· Could the same problem happen with OMB? (Yes - but only because it’s a monoculture, there’s only Laconi.ca. It’s less likely to happen, however, because it’d involve more effort, since it’s federated at least)

· Could the same problem happen with XMPP? (No - the XMPP network contains lots of different implementations, so a security flaw in one won’t affect everyone)

That there was a serious breach of security in Twitter is indisputable. That there’ll be others is likely. It’s also pretty likely that something like this will happen to Laconi.ca - sadly, “many eyes” don’t really help security all that much - but if more OMB implementations appear, this window of opportunity will vanish. It’ll never happen on the same scale with XMPP - no single vendor has the market, there is federation without monoculture.

So, if you’re going to trust your public image to a short public broadcast messaging service (or µblogging system), which one are you going to pick?

by dwd at January 06, 2009 05:34 PM

Python

Alexander Artemenko: Python Google Chart

Link: "Python Google Chart".

Easy to use python wrapper for Google's Chart API.

January 06, 2009 04:48 PM

Mozilla

Laura Mesa: Quarterly Survey Results, December 2008--84% Satisfaction Rating

The second installment of the Quarterly survey was released on December 14th with a total of 15,823 responses in ten locales. The survey was hosted for a week and a half by surveygizmo.com and displayed to 10% of users on the Firefox 3.05 "What's New Page".

Overall, this survey received half as many responses as the survey released in September (30,272). We also had some trouble getting responses from both Chinese locales, even when increasing the display percentage from 10%-50% of all Chinese-language users. Regardless, we have a confidence interval of 3.3 for zh-cn and 2.45 for zh-tw with a 99% confidence level.
All the other locales have between .5-.9 confidence interval and 99% confidence level. (I removed Question 6 from this overview because of a data recording error).

Responses have remained pretty consistent in the two surveys. About 52% of people found out about Firefox through a recommendation in this installment compared to 55% in the last survey. The consistency in responses to this question shows that the user's experiences with Firefox and their positive interpretations of these experiences drive further awareness of Firefox.

The next question "How long have you been using Firefox" was added to this installment of the survey in order for us to understand the backgrounds of the people answering the survey.


70% of the people who responded to this survey have used Firefox for more than a year, with the majority of that 70% (44%) having used it for more than two years. This may be because our longer term users (because of their high level of satisfaction) are more likely to take a survey about Firefox. It may also have something to do with the timing of the survey, with our hardcore/long-term users (who also tend to be online most of the day) more likely to be active on the Internet in mid-December than one of our newer/less intense users. Regardless, there may be a slight skew towards answers we would associate with the longer-term Firefox user.

















The primary reason for download of Firefox was performance followed by security and a recommendation--consistent with last quarter's results. I still don't really understand why customization is so low on the list, especially considering the responses to my add-ons question (#5 which shows 56% of respondents saying they have installed an add-on).We may have gotten such a high awareness(I'm calling awareness a positive response) because most of our long-term users know about add-ons--and with more than 70% of our respondents using Firefox for more than a year, this could be a very plausible explanation.















Looking at the cross-tab analysis of questions 3 and 5, it appears as though those people who have used Firefox for more than 2 years are most likely to have installed an add-on (53%). Users who have used Firefox for 1-2 years (green highlight) are almost equally likely to have an add-on as to not have one or to not know what an add-on is. What's even more interesting (at least to me, anyway) is that the the users who have had Firefox for 6 months or less are more likely to not have an add-on or to not know what an add-on is. As the length of time of use continues to go down, users are even less likely to have an add-on. This data suggests and confirms what many of us at Mozilla already know--that we have to do a better job of introducing new users to add-ons and their benefits during each new users first session(s) with Firefox.







In last quarter's results I broke down Internet usage into light, medium and heavy usage. From now on, we're not going to combine the different "usages" in order to try and learn the most we can from the information we get. It does look like the results from both quarters, however, are consistent, with mos of our users falling in the "moderate Internet usage" range (2-5hrs).















Lastly, and most importantly, we have our Quarterly Customer Satisfaction numbers...

We get this number by following the methodology of Net Promoter--Combine the 4s and 5 and subtract the 1s and 2s from that total and ignore the 3s. In this quarter we would add 65 and 21 (86) and subtract 2 for a grand total of 84% satisfaction rating. Last quarter our satisfaction rating was 89%. So far, the number seems pretty consistent--the real test will be with next quarter to see how we perform.



















You can find more in-depth results in the following files hosted on mediafire.com. Feel free to check out.

http://www.mediafire.com/file/ywz343zdxdo/report12-30-08 Report 12-30-2008.pdf (Original report)
http://www.mediafire.com/file/mlma2wykaj2/ResultsSurveyQ42008.xlsx (In depth for every locale)

January 06, 2009 04:45 PM

Mozdev: Sysadmin Meeting Minutes for 2009.01.06

Participants: kinger (Brian King), silfreed (Doug Warner)

Community participants: [none]

Discussion was held publically in #mozdev

Discussed developer priorities

Discussed sysadmin priorities

Server migration

Next meeting January 13, 2009 @ 16:00 UTC in #mozdev

by silfreed at January 06, 2009 04:43 PM

Ben Hearsum: Firefox 3.1/3.2 builds no longer reporting codesighs ‘mZ’ metric

bug 358845 pointed out that the ‘mZ’ we report for Codesighs tests is meaningless for Firefox. As such, we have stopped running it. This is just a quick note to let people know not to panic, it’s fine! The ‘Z’ number is still being reported and valid.

by bhearsum at January 06, 2009 03:55 PM

L. David Baron: Semi-vacation

I spent the last two and a half weeks on the east coast (in the D.C. and Philadelphia metro areas), visiting family and friends. I didn't spend the whole time ignoring work, though. (And I wasn't the only one; my dad had a big (electronic) pile of final exams to read, and a journal issue to finish.)

Both because other people weren't around much (asking questions, asking for reviews, etc.) and because I was away from the distractions of the office, it was a good chance to work on some larger tasks (rather than go through blocker lists). Airplane and train rides are especially good for this (and it's not even possible to work through blocker lists without substantial preparation, since it's very hard to use Bugzilla offline)

So, in the past few weeks, I:

Now I'm back in California, and I'll be back in the office in a few hours, and should be getting back to working through smaller tasks shortly, such as the end (I hope) of the 1.9.1 blocker list.

And maybe I'll even blog more this year.

by David Baron at January 06, 2009 03:40 PM

Mozdev: W51-2008 - W1-2009 Dev Status Update

I didn't spend a whole lot of time around Mozdev over the holidays, but things should be picking back up now.

Things I did touch on over the holidays included:

To kick off the new year I have some minor bugs with the project creation automation to iron out and will begin looking over the roadmap to evaluate where to go with the top priorities. Some things like simplified wiki editing needs re-examined now that there is a split in wiki syntaxes in the Mozilla universe (MDC uses DekiWiki syntax while WMO uses MediaWiki syntax). Other things like the extension project wizard just need evaluated to see how it can best be integrated into our new-project creation process.

by silfreed at January 06, 2009 03:11 PM

Python

The Blog - Juri Pakaste: Emacs tips: Navigate CamelCase words

Emacs tip #0: Always search EmacsWiki when you think you might need something.

Emacs tip #1: To navigate studlyCapped words, M-x c-subword-mode, as found on the CamelCase page. I had to add the following lines to my .emacs to get it work with C-left/C-right, M-b/M-f worked right out of the box:

(define-key global-map [(control right)] 'forward-word)
(define-key global-map [(control left)] 'backward-word)

Before that, they were bound to the -nomark variants.

January 06, 2009 02:34 PM

Sean McGrath: From Personal Computer to Impersonal Chameleon

Booting from something you carry around in your pocket. There is a trend there I think. A trend that could take the "personal" out of the PC box and into your pocket which, arguably, is where it belongs in this day and age : From Personal Computer to Impersonal Chameleon.

January 06, 2009 02:32 PM

IronPython Url's: John Udell in the Cloud with IronPython

John Udell is a well known blogger with an interest in Python, who now works for Microsoft. Recently he has been exploring various aspects of working with Microsoft technologies with Python, including several posts on using the new cloud computing platform Azure.

His first post doesn't show much code:

But what happens behind the scenes is quite interesting to me. The URL hits a deployment in the Azure cloud where I’m hosting an IronPython runtime. Then it invokes that runtime on a file that contains this little Python program:

hello = "Hello world"

Finally, it gets back an object representing the result of that program, extracts the value of the hello variable, and pops it into the textbox.

This is the proof of concept I’ve been looking for.
He updates this post with a status report:
I’m exploring the viability of Python as a way of programming the newly-announced Microsoft cloud platform, Azure. Partly that’s because I love Python, but mainly it’s because I believe that the culture surrounding Python and other open source dynamic languages can fruitfully cross-pollinate with the culture that infuses Microsoft’s platforms.
It isn't as straightforward as he'd hoped - both because of the lack of C extensions used by standard library modules and because of the Azure security policy.

Jon does however turn his proof of concept into "a service in the Azure cloud that aggregates calendar events from Eventful.com and from a diverse set of iCalendar feeds".
Jon explores the problems of working with Azure from IronPython - Azure runs in a 'medium trust' environment, something that only partly works with IronPython. He also talks about the blurring of the lines between static and dynamic languages:
Along the way, I’ve been recalling something IronPython’s creator, Jim Hugunin, said at the Professional Developers Conference back in October. Jim’s talk followed one by Anders Hejlsberg, the creator of C#. Anders showed an experimental future version of C# that makes use of the Dynamic Language Runtime which supports IronPython and IronRuby on .NET. The effect was to create an island of dynamic typing within C#’s otherwise statically-typed world. We all appreciated the delicious irony of a static type called ‘dynamic’.

Jim might have sounded a bit wistful when he said: “I’m not sure what a dynamic language is any more.” But I think this blurring of boundaries is a wonderful thing. Many smart people I deeply respect value the static typing of C#. Some of the same smart people, and many different ones, value the dynamic typing in languages like Ruby and Python. If I can leverage the union of what all of those smart people find valuable, I’ll happily do so.
His more recent posts track the development of this project, including how his experience of Python development is affecting the C# he writes.

January 06, 2009 01:34 PM

Mozilla

Calendar: Date range added to holiday calendars - Help needed to update outdated holiday calendars

Yesterday I finally managed something that I've been basically planning to do f or years: Fixing bug 456938.

As you can see from the updated holiday calendar page on our website, every holiday calendar is now annotated with its duration of validity. That will hopefully reduce the frustration that some of our users have felt, when they subscribed themselves to an outdated holiday calendar in the past. It will also make things much more easier for me to maintain the holiday calendar page in the future by enabling me to quickly determine whether a holiday calendar is still valid or not.

However the downside of this exercise has been that (as of the time of writing) I've identified 27 holiday calendars, which are outdated. I've removed those calendars from the holiday calendar page for now, but the old files are still in place so as to not deliberately break people, who have subscribed to them.

My plan right now is to delete the outdated files after a period of 2-3 months if no update materializes. It would be great if our community could step in here and provide updates for the remaining outdated holiday calendars.

It would also be great to get holiday calendars for those countries that aren't currently listed either on the holiday calendar page or the outdated holiday calendar buglist.

January 06, 2009 01:07 PM

Python

IronPython Url's: Consuming Extension Methods in IronPython

Extension methods are a feature of .NET 3 that allows you to add methods to existing types. These are effectively static methods, but are called as if they were instance methods on the extended type.

Saveen Reddy has a blog entry on using these methods from IronPython.

It turns out to be harder than it should be...

January 06, 2009 11:11 AM

Armin Ronacher: Opinionated Frameworks

Once again my post about Jinja and the Django template engine appeared on reddit. The second time in the last two weeks, probably because my feeds changed and planets re-displayed it.

I originally wrote the post a few months ago to promote Jinja a bit. I was and still am very happy with Jinja2 and wanted to write some lines about what I like about it and how it works. And I also was hoping that the Django guys have a look at it and copy some features of it. Mainly because every once in a while I contribute code to a Django powered project or have my fingers in some way in such a project's code. And every time I'm kinda puzzled how simple some really complex tasks in Django are.

So what has changed in Django's templates the last four months? Not that much. The only changes in the Django template engine was the addition of {% empty %} blocks in {% for %} loops (which does exactly what Jinja's {% else %} does for loops) and some bug fixing. Is that a problem? I don't know, but probably not.

Django's templates are still slow and limited as they were, but it's not causing problems so that users have to switch. Every once in a while I notice that people switch to Jinja from Django templates because of performance of the limitations, but very often they throw away half the framework because they discover that Python has more to offer than just Django. And with that in mind I guess the Django guys are doing the right thing.

Django is designed for content driven websites not so much for independently deployed applications (like trac, WordPress, MediaWiki and others). So not so much for applications and also not so much for stuff where you need crazy database queries that are not possible with Django. The template engine is designed for simple HTML generation and that's it. If you want more, you often want something different than Django anyways.

I know many successful projects that are running Django without problems and it works out for them, because their requirements match (nearly) exactly what the framework was developed for. And I know many that adopted Django because of the fuzz but what they actually want to do does not fit into the Django style of development.

In many ways Django reminds me a bit of unpacking cool stuff. You download it and are instantly blown away how cool it is. Database just works, templating is awesome, URL routing gives you these incredible neat looking URLs and much more. It's so cool that many are trying to suddenly do everything with it. And that's kinda where the problem lays. You are forcing Django to do things it's not designed for.

I think what is missing is a website that explains the advantages and disadvantages of the particular solutions and what projects work best with what solution. There are Pylons, Werkzeug, Paste, Repoze and a lot more frameworks and utility libraries that focus on different kinds of web applications. And that does not only apply to full blown frameworks or WSGI utilities, but also template engines, database libraries and even databases themselves. It would prevent a lot of frustration if people could find the framework or toolchain of choice before they start developing their project.

But such a page would have to be designed by someone unbiased. And neither me, nor anyone else who develops on/for a Python powered framework should create such a comparison page. But I would encourage everybody with experiences in multiple frameworks to write down their experiences with different Python frameworks, template engines, database adapters and combinations thereof.

Update: Fixed misleading sentence. Swapped complex and simple.

January 06, 2009 10:16 AM

Mozilla

Marco Zehe: NV Access published their progress on the Mozilla Foundation grant

The new year starts out with a bang! NV Access, the makers of theNVDA, a free, open-source screen reader for Windows, have published their progress report on the current Mozilla Foundation grant. The grant goals were laid out for a three year period, and look what was accomplished in the first year alone! Mick and Jamie, you rock!

Bookmark NV Access published their progress on the Mozilla Foundation grant using AddThis

by Marco at January 06, 2009 10:12 AM

Brian King: Retrieving Your Extension Version

From time to time when reviewing add-ons on AMO, I notice that the version number of the extension is hard-coded. The author needs it to fork some code because of API differences across versions of the Mozilla application, or perhaps some other reason.

Hard-coding is not necessary. In most cases the version should only be in install.rdf. The version can be retrieved from the nsIExtensionManager/nsIUpdateItem interfaces. Here’s the basic snippet:


var emid = "cooladdon@mydomain.com"; // Should correspond to em:id in install.rdf
var version = MyExt.getExtensionVersion(emid);
MyExt.getExtensionVersion = function(emid)
{
var em = Components.classes["@mozilla.org/extensions/manager;1"]
.getService(Components.interfaces.nsIExtensionManager);
var addon = em.getItemForID(emid);
var versionString = addon.version;
return versionString;
}

And so it goes. You can retrieve other information about the extension via these interfaces.

by brian at January 06, 2009 09:40 AM

William Quiviger: Call for Community Photos!

Maow communityFirst of all, a very happy new year to everyone! The past couple of weeks have been relatively quiet, so it's taking me a couple of days to "adjust" and get back into the fast-paced, energy-filled Mozilla work-routine i've grown accustomed to since joining the team last year. (wow...felt strange typing those two last words...)

In any case, I hope you are well rested, dear reader, and that you are all geared up for what promises to be a very exciting year for the Mozilla community. Lots of great community events are lining up and more are in the process of gestation. I'll be writing about them in my next posts and will be hanging around IRC a lot to share ideas and get feedback from as many people as I can across Europe.

Now, on another related matter, as you know, Mozilla has been working on a community marketing guide that my colleague Patrick nicely describes here. The guide's aim is to assist Mozillians interested in promoting the Mozilla project in their town, school, city, university or wherever they see fit. We're adding the finishing touches to it and it should go live pretty soon.

Now, one thing we really want to do is illustrate the guide with community photos. The community marketing guide is for the community, so it only makes sense to illustrate it with photos of the community taken by the community. If you have photos you'd like to see up up on the guide, please do send them to us. All you need to do is fill in this short form (or this one if you're a minor), scan it and email it back to us along with your photo(s) to william at mozilla dot com. Obviously, we won't be able to publish all of the photos we receive, but we'll definitely do our best :)

by William at January 06, 2009 09:24 AM

FreeDesktop

Alberto Ruiz: On applets, launchers and notification areas

The last post from Ted Gould nails a pretty obvious problem on the GNOME desktop nowadays: the panel is broken.

Not only because of the fact that is one of the remaining bits holding a dependency against ORBit. But also from the ui perspective. The panel is where we throw stuff when we don't know where to place it. The topic discussed in Ted's post is quite interesting, the abuse of the notification area. I kind of disagree that apps tend to use the notification area because is some sort of playground or innovation space or anything like that.

I think applications are leaning towards a better window management handling that cannot be achieved with launchers or the task browser.

Think about it for a moment, we have launchers, like the browser one. You launch your browser, and suddenly, you have to waste, I don't know... 200 pixels for a new task on the task bar? Plus the already wasted space of the launcher of course. Now your app turns out to be so nice, that people want to use it all the time, becoming a persistent app. Well, wasting 200 pixels for each window of your app seems a bit odd, so you end up using the notification area, or creating your own applet to manage your app.

To me, it seems that we could perfectly merge launchers, applets and notifications. Think about it, remove the text from the task manager (which I think that is useless with the amount of windows that people handle nowadays) , allow iconification/minimize from there, allow notifications and rich interaction (showing the album cover for media players, custom context menus...). From the user perspective, this would remove a lot of redundancy.

I think that a dock-like approach such as avant window navigator  (with some GNOME HIG+usability+accesibility's sauce first of course) or Karl Lattimers' toy as even would be a much simpler, uncluttered and usable option than our current box of entropy.

January 06, 2009 07:14 AM

Python

Go Deh: word differ

My brother was over from France this new year and he asked me to write him a small script for the first time.

He had a problem in that he had some prose in a foreign language, and a list of words that the students should learn. He wanted stats on what words from the list were actually used in his prose.

I wrote the following small script. Interestingly enough, the bit that needed a bit of research was doing the graphical file opening for Windows - I really am that used to a Unix environment :-)

It is a very simple program but, on reflection, I can remember doing similar work twenty years ago in AWK: finding out what is different between two 'things' and printing the differences in a sorted order. Back then I would have used Suns original awk, keeping the two sets of data in associative arrays, doing the set arithmatic in explicit for loops, and calling out to the Unix sort utility to print sorted output. Such specialized diff'ing tasks have crept up regularly for me, and they are now very easy to do in Python (or Perl); and I have never had to resort to C for even the largest datasets I've encountered.

word_differ.pyw

Here is the program word_differ.pyw:
# -*- coding: cp1252 -*-

'''
  Find the difference in words used in two documents

  Asks for two files which then have their words extracted and compared.

  Most punctuation, and all words of just numbers are dropped.

  (C) 2009 Donald 'Paddy' McCarthy. paddy3118@gmail.com
'''

import Tkinter, tkFileDialog, re, datetime, sys
root = Tkinter.Tk()
root.withdraw()


def wordsinfile(f):
    words = set()
    txt = f.read()
    words = set( w.lower() for w in re.split(r"""[ \t\n\-,;:\.\?@#~=+_!"£$%^&\*\(\)<>|\\\[\]{}`]""", txt)
                 if w and not all( c in '0123456789' for c in w) )
    return words


f1 = tkFileDialog.askopenfile(parent=root,initialdir="/",title='First text file for word diffing')
if not f1: sys.exit()
f2 = tkFileDialog.askopenfile(parent=root,initialdir="/",title='Second text file for word diffing')
if not f2: sys.exit()
f3 = tkFileDialog.asksaveasfile(parent=root,initialdir="/",title='Save output as file (end with .txt to create a windows text file)')
if not f3: sys.exit()

set1 = wordsinfile(f1)
set2 = wordsinfile(f2)

print >>f3, "Output from program word_differ.py (Author Donald McCarthy: (C) 2009)."
print >>f3, "  Generated on: " + datetime.datetime.now().isoformat()

print >>f3, "  First File:  " + f1.name
print >>f3, "  Second File: " + f2.name
print >>f3, "  Output to:   " + f3.name

print >>f3, "\nWords in the first file that are not in the second:"
for w in sorted(set1 - set2):
    print >>f3, " ", w
print >>f3, "\nWords in the second file that are not in the first:"
for w in sorted(set2 - set1):
    print >>f3, " ", w
print >>f3, "\nWords common to both files:"
for w in sorted(set1 & set2):
    print >>f3, " ", w

f1.close(); f2.close(); f3.close()

Example word list: word list.txt

  back
  black
jump  
  bored
  hair
  missile
  lamb
  little
  played
  sent

Example prose: rhyme.txt

Mary had a little lamb
Who's hair was long and black.
She played with it,
Got bored with it
And then she sent it back!

By Paddy McCarthy - 2009-01-04.

Example output: diff.txt

Output from program word_differ.py (Author Donald McCarthy: (C) 2009).
  Generated on: 2009-01-04T07:20:18.890000
  First File:  C:/Documents and Settings/All Users/Documents/Paddys/word_differ/word list.txt
  Second File: C:/Documents and Settings/All Users/Documents/Paddys/word_differ/rhyme.txt
  Output to:   C:/Documents and Settings/All Users/Documents/Paddys/word_differ/diff.txt

Words in the first file that are not in the second:
  jump
  missile

Words in the second file that are not in the first:
  a
  and
  by
  got
  had
  it
  long
  mary
  mccarthy
  paddy
  she
  then
  was
  who's
  with

Words common to both files:
  back
  black
  bored
  hair
  lamb
  little
  played
  sent

January 06, 2009 06:45 AM

Mozilla

Mark Finkle: XULRunner 1.9.0.5

The newest official XULRunner has been released. XULRunner 1.9.0.5 matches the Firefox 3.0.5 release. For XULRunner developers, most of the changes in 1.9.0.5 are related to security fixes. You can also look at the full list of fixed bugs.

Runtimes
SDKs
Source tarball

Want to get started building XULRunner applications? We have an article for that.

by Mark Finkle at January 06, 2009 05:34 AM

Meeting Notes from the Mozilla community: Mozilla Project Meeting Minutes: 2009-01-05

WeeklyUpdates/2009-01-05

From MozillaWiki

« previous week | index | next week »

Meeting Details

note: all participants are muted automatically; if you want to talk, press *1 to un-mute yourself

WeeklyUpdate Live: You can watch the weekly meetings live at Air Mozilla You can also view previous meetings from the “on-demand” button on the Air Mozilla player. Meetings will be posted for on-demand consumption shortly after the meeting conclusion.


Friends of the Tree

Please send FotT nominations to asa@mozilla.org. This is a great opportunity for the community to recognize those who go above and beyond, so please tell me when you see that happening. Thanks.


Development Updates


Branch work: Firefox 3.0.6 / Major Update


Gecko 1.9.1


Firefox 3.1

Firefox 3.1 Beta 3


TB 3


Mobile


IT


Release Engineering


QA

Welcome Marco Zehe and Henrik Skupin as new employees!

Test Execution

Web Dev Testing, Metrics, Accessibility, Localization, Crash Reports

Test Development


Security


Marketing/PR

PR


Support


Metrics


Evangelism


Labs


Developer Tools


Add-ons


Webdev


L10n


Foundation Updates


Roundtable


Other Business

by bsmedberg at January 06, 2009 04:00 AM

Mozilla Add-ons Blog: Introducing myself

Hi, I’m Nick Nguyen, and I’m the new Add-ons Lead here at Mozilla.  Having previously worked on the Delicious Bookmarks extension at Yahoo!, I’ve learned firsthand how Add-ons can be an essential part of life on the internet.  I’ll be working with the team and the community to figure out the best direction for AMO as we evolve.  Along with the entire Add-ons team, I’ll help drive discussion both within Mozilla and with the greater community on how we can grow and improve.

In 2009, we plan to focus on the following areas:

  1. Communicating the value of Add-ons to users who will benefit from them
  2. Improving the sense of community for Add-ons users and developers and fostering open communication between both groups.
  3. Streamlining and simplifying the process of both developing and submitting Add-ons to AMO.

Of course, like everything else at Mozilla, our decisions don’t happen in a vacuum.  As a member of our community, your feedback is invaluable and helps us drive our product direction.  I’ll continue to post updates with our thinking on a regular basis, and don’t hesitate to let us know if you have some feedback, positive (yay) or negative (boo, but we need to hear it).

Thanks for reading, and Happy New Year!

Nick Nguyen, Add-ons Lead

ShareThis

by nick at January 06, 2009 01:59 AM

Mary Colvig: A resolution I can get behind: Spreading Firefox!


I’m not really one to make New Year’s resolutions because, frankly,  I don’t keep them!   However, my colleague Alix shared this awesome initiative to introduce five people to Firefox in 2009.  I’m jumping on board and vow to:

This campaign serves as a great reminder that nothing tops face-to-face interaction and word of mouth to spread Firefox.  There’s even a Facebook group.  Keep up the great work!

      

by Mary Colvig at January 06, 2009 01:36 AM

Mozilla Web-Tech Blog: Web Workers, Part 3

Beta 3 marks the end of the worker changes we expect for Firefox 3.1, so here’s a rundown of what has changed since Beta 2:

  1. The navigator object has been added to the worker scope. It contains the following strings that identify the browser, just as from normal script:
    • appName
    • appVersion
    • platform
    • userAgent
  2. Workers can now be forcefully killed via the terminate function. Calling this function on a worker will immediately stop the worker’s execution.
  3. Workers may only be created from a worker script that is hosted within the same origin as the parent page.
  4. URIs for subworker scripts and imported scripts are now resolved relative to the parent worker script location instead of the owning page.
  5. Error handling has been reworked according to recent spec changes. A worker script can now define an onerror handler that will be called with an error event with details about the exception. If the handler calls preventDefault on the event object then nothing else happens. If preventDefault is not called then the error event propagates to the parent scope’s (either a worker or the parent page) onerror handler.
  6. Numbers, booleans, and even objects may be passed to postMessage in addition to strings. The only restriction is that objects may not contain functions or cyclical references (since we use JSON under the hood). This simplifies previous code that needed to use the JSON object to manually encode/decode the strings passed to postMessage.

To illustrate some of these new features I decided to use workers to decrypt Weave user data (bookmarks, cookies, etc.). Using some code that Anant Narayanan created a while ago for the 0.2 version of the Weave server (which is deprecated, by the way - the 0.3 server has recently emerged!) I created an app that works on real data that I copied from services.mozilla.com. Check it out here, but make sure that you’re using the latest branch nightly (or Beta 3 as soon as it is available). And many thanks to Dan Mills for helping me get this all working.

Continue on to the full post to see how it works.

Weave data decryption requires a username and a private key passphrase. If the data still lived on the services.mozilla.com server it would also require a server password, but I didn’t go that far for this demo. All user data is encrypted with a private key that is itself encrypted, so decrypting the private key must be the first step. After the private key is decrypted then all requested user data is tackled independently and in parallel. For details about the way Weave stores user data please see this excellent post by Atul Varma.

First, the page collects username, password, and server information, as well as the types of user data that should be decrypted. It then spawns the main worker. This worker spawns a subworker to decrypt the private key, then spawns multiple workers to handle each type of user data. Subworkers are used so that the process can be canceled at any time.

Here’s an overview of each file involved in the process:

  1. weaveDecryptor.html
    • Launches the main worker, weaveDecryptorWorker, and communicates the form data (username, passphrase, server location, and the types of data that should be decrypted) to it.
    • Informs the worker that it should cancel subworkers if the Cancel button is pressed.
    • Updates the UI as messages are received from the worker.
  2. weaveDecryptorWorker.js
    • Launches the keyDecryptor subworker to decrypt the user’s private key.
    • Once the private key has successfully been decrypted it launches a dataDecryptor subworker for each type of weave data that was requested.
    • Maintains a list of currently running workers so that they can be canceled.
    • Also maintains some state, like a cached copy of the decrypted private key and whether or not the passphrase was correct.
  3. keyDecryptor.js
    • Username and passphrase info is passed into the worker from the parent.
    • Decrypts the user’s private key and sends the key bits back to the parent.
  4. dataDecryptor.js
    • The parent passes in the private key bits and the type of data that should be decrypted.
    • Decrypted data is passed out to the parent.

by Ben Turner at January 06, 2009 01:33 AM

Robert O'Callahan: Invalidation Reftests

I've written before about how awesome reftests are. Now they're even more awesome! Until now reftests have always worked by taking a snapshot of the entire window at the end of the test and comparing that to a snapshot of the reference page. However, there's a fairly large class of bugs which we call "invalidation bugs" --- they only show up when you redraw part of a page, and when you draw the whole page everything's fine. These are usually either bugs in figuring out which part of the page needs to be redrawn after some dynamic change, or bugs in the optimizations that try to skip drawing elements that don't intersect the area being redrawn. We had no way to write automated tests for these bugs. Now we do!

Reftests have long supported a feature called "reftest-wait". Tests whose root element has class "reftest-wait" do not finish when their load event fires. Instead, the reftest system waits for the "reftest-wait" class to be removed from the root element, then it takes the snapshot and moves to the next test. This lets a test finish loading and then change something dynamically to see if the layout and rendering after the incremental change is correct. I've extended "reftest-wait" so that we take a snapshot after the load event has fired and then as further incremental changes happen, areas of the snapshot are updated corresponding to the areas actually repainted in the window. (This is implemented in the reftest harness using MozAfterPaint.) Implementing this actually exposed a few invalidation bugs just using the reftest-wait tests in our existing test suite.

There's some subtlety around the timing of incremental changes. Invalidation and repainting can happen asynchronously, so it's possible that the load event causes a pending repaint of the entire window and a test script running after the load event might make an incremental change that is not really tested because a full repaint of the window happens anyway. To make sure incremental updates are reliably tested, the reftest harness takes responsibility for making sure invalidation and repainting are completely flushed out after the load event has fired. Then reftest fires a "MozReftestInvalidate" event at the test document's root element; this is the cue for the test to perform its dynamic updates to be sure their repainting will be properly tested.

by roc at January 06, 2009 01:31 AM

Python

Alec Thomas: Moving house

I am moving my blog to Posterous and taking the opportunity to separate concerns.

Technical articles will be posted to http://swapoff.posterous.com while personal stuff (probably mostly rants) will go to http://alecthomas.posterous.com.

January 06, 2009 01:12 AM

Mozilla

Alice Nodelman: Auto-Rebooting Talos Boxen Saves The World

Bug 463020 - Talos machines should be automatically rebooted periodically has finally been fully implemented and resolved fixed.  Here’s what we know about Talos machines:

  1. The longer the uptime the less trustworthy the numbers
  2. Machines can stay up and report untrustworthy/garbage numbers for a long time before anyone notices - as long as the machine cycles green it is usually ignored
  3. Monitoring every active Talos box to see what machines need a reboot is complicated and difficult

Since the majority of the Talos work that comes across my desk ends up as reboot requests to solve machine number drift,  the obvious solution is to start a system of auto-rebooting.  It turned out that doing so wasn’t even that complicated due to earlier work I’ve done on the system to ensure that Talos machines come back from reboot ready to test and auto-reconnect to their buildbot master.  Thanks to catlee for the patch required to get that last piece in place that fires at the end of every test cycle on every talos machine and starts a reboot.

Now when looking at performance results you can rest assured that the machine that did the testing was in a clean state, newly rebooted and without any extraneous processes kicking around from previous busted browsers/crash reporters/spawned dialogs/whatever.  No longer do we have to live in fear of Bug 419620 - qm-mini-vista04 (branch) numbers gradually rising and other such bugs resulting from long uptimes on Talos test boxes (say, Leopard Talos boxes showing odd spikes in results very 5-20 test cycles, or Tiger Talos boxes having runaway Terminal processes after a few dozen test cycles, etc).

The nifty side effect is that the variance between results is also decreased - I see much smoother lines on every platform.  The only downside here is that we do lose machines that fail to reboot.  At the moment, I’m seeing about 5-6 machines fall over per week.  This does increase the load on IT as the only solution is a manual kick and thus requires a trip to the colo.  They’ve been real good sports about the increase in bug traffic brought about by this change.

Thanks again to catlee and IT for their help.

by alice at January 06, 2009 01:01 AM

Aza Raskin: Interview with Geek Entertainment TV

A little about the design process, growing up with Jef Raskin as my father, watch manuals, and designing in the open at Mozilla.

by Aza Raskin at January 06, 2009 12:21 AM

FreeDesktop

Jesse Barnes: I hate spam

I’ve been really bad at dealing with spam on this blog, but I just went through the posts from the last few months and cleaned things up. So if you’ve made comments, you might actually see them now and maybe even see replies…

January 06, 2009 12:03 AM

Mozilla

Les Orchard: Enter the LizardFeeder

The Mozilla Tree

The Mozilla Tree

Behind Firefox is Mozilla, and behind Mozilla is a community. And the Mozilla community acts a lot like an ecosystem, which can be visualized as a kind of living tree—not to confused with the mozilla-central tree. Oh yeah, and Mozilla is the name of both a Foundation and a Corporation.

Confused yet? If not, then we should talk so you can explain it to me, because it all looks pretty tangly and intertwingled to me. Nonetheless, it seems to work, and produces a good chunk of my favorite software and technologies.

There are many efforts to track what’s going on—including planets and newsletters and bugzillas and wikis and repositories and tinderboxen. Some of these resources report on, or are driven by, the activity occurring in the others. Some are automated, and others are carefully stitched together by hand. None offer a full picture of what’s going on in the Mozilla galaxy in a way that’s casually comprehensible by a sane human being.

Of course, that’s not a slight against any of these sites or the people maintaining them—extracting an overview from such an organic phenomenon is neither easy nor straightforward. But, it might be fun to try.

As an infovore and avid practitioner of continuous partial attention, my first impulse is to reach for a firehose and stick my head into the stream. Relax, defocus, and try to let my pattern recognizers do their thing—sometimes those pattern recognizers are in my head, and sometimes they’re written in Python.

Firefox Victory Robot

Firefox Victory!

But, for Mozilla, I couldn’t find a stream of sufficient volume or completeness to satisfy me or my robots. Happily, though, my feeding urge found itself aligned with a project to discover the patterns of contribution in the Mozilla community and to find a way to thank the contributors responsible.

So, while we’re still working on the thank-you angle, allow me to introduce you to the Lizardfeeder. The LizardFeeder is a feed aggregator, whose source code is built atop Sam Ruby’s Planet Venus. The LizardFeeder pulls together and archives activity streams from a wide variety of Mozilla community sources. Beyond the usual human-readable pages produced by a blog-gathering Planet, the LizardFeeder accumulates statistical and historical data meant for consumption and analysis by robots.

At present, the only robot navigating the LizardFeeder archives is an AJAX-ified user interface that animates the firehose as a near real-time or time-lapsed stream of events scrolling by.

This is just meant as a conversation sta